﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;

namespace  RzCorportativo.Views.Consulta
{
    public partial class Agenda : BasePage
    {
        private object DataSource
        {
            get { return this.Session["$Agenda$DataSource"]; }
            set { this.Session["$Agenda$DataSource"] = value; }
        }

        protected HtmlString CreateLink(object dataItem)
        {
            if (!(dataItem is RzCorportativo.Lib.Agenda))
                return new HtmlString(string.Empty);
            HtmlString html = (dataItem as RzCorportativo.Lib.Agenda).Avaliado ?
                (dataItem as RzCorportativo.Lib.Agenda).Aprovado ?
                new HtmlString("<span>confirmado</spa>") :
                new HtmlString("<span>não confirmado</spa>") :
                new HtmlString("<a class='btn' href='javascript:Aprovar();' id='aprovaItem' item='" + (dataItem as RzCorportativo.Lib.Agenda).AgendaId.ToString() + "' dataValue='" +
                    (dataItem as RzCorportativo.Lib.Agenda).DataConsulta.ToString("dd/MM/yyyy")
                    + "' horaInicio='" +
                    (dataItem as RzCorportativo.Lib.Agenda).HoraInicio.ToString(@"hh\:mm")
                    + "' horaFim='" +
                    (dataItem as RzCorportativo.Lib.Agenda).HoraFim.ToString(@"hh\:mm")
                    + "'>confirmar</a>");
            return html;
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if ("s".Equals(Session["op"]))
            {
                Alert alert = new Alert("erroGeral", this);
                alert.AlertType = AlertType.Success;
                alert.Add("sucess", "Item salvo com sucesso");
                alert.Show();
                Session.Remove("op");
            }
            this.ListaAgendamento.SetSystemPageSize();
            if (this.IsPostBack)
                return;
            var lista = RzCorportativo.Lib.Agenda.Listar(new RzCorportativo.Lib.Agenda() { Avaliado = false });
            if (lista != null)
                lista = lista.OrderByDescending(l => l.DataConsulta).ToList();
            this.ListaAgendamento.DataSource = this.DataSource = lista;
            this.ListaAgendamento.DataBind();
            var especialidades = RzCorportativo.Lib.Especialidade.Listar(new RzCorportativo.Lib.Especialidade());
            especialidades.Insert(0, new RzCorportativo.Lib.Especialidade() { Descricao = "Selecione", EspecialidadeId = 0});
            this.Especialidade.DataSource = especialidades;
            this.Especialidade.DataValueField = "EspecialidadeId";
            this.Especialidade.DataTextField = "Descricao";
            this.DataBind();
        }

        [WebMethod]
        public static string Aprovar(int agendaId, string dataInicial, string horaEntrada, string horaSaida)
        {
            try
            {
                RzCorportativo.Lib.Agenda agenda = RzCorportativo.Lib.Agenda.CreateInstance(agendaId);
                RzCorportativo.Lib.Consulta consulta = new RzCorportativo.Lib.Consulta();
                string erros = string.Empty;
                if (agenda == null)
                    return "Código inválido para o agendamento\n";
                DateTime dt = DateTime.MinValue;
                TimeSpan tmsp = TimeSpan.MinValue;
                if (!DateTime.TryParse(dataInicial, out dt))
                    erros += "Data inválida\n";
                if (dt < DateTime.Now.Date)
                    erros += "Data inválida. A data tem que ser maior ou igual a " + DateTime.Now.ToString("dd/MM/yyyy") + "  \n";
                consulta.DateConsulta = dt;
                if (!TimeSpan.TryParse(horaEntrada, out tmsp))
                    erros += "Hora de entrada inválida\n";
                consulta.HoraEntrada = tmsp;
                if (!TimeSpan.TryParse(horaSaida, out tmsp))
                    erros += "Hora de saída inválida\n";
                consulta.HoraSaida = tmsp;
                if (consulta.HoraSaida <= consulta.HoraEntrada)
                    erros += "Hora de saída inválida, a hora de saída não pode ser maior que a de entrada\n";
                consulta.EspecialidadeId = agenda.EspecialidadeId;
                consulta.MedicoId = agenda.MedicoId;
                consulta.PacienteId = agenda.PacienteId;
                var consultas = RzCorportativo.Lib.Consulta.VerificarAprovacao(new RzCorportativo.Lib.Consulta()
                {
                    DateConsulta = consulta.DateConsulta, HoraEntrada = consulta.HoraEntrada, HoraSaida = consulta.HoraSaida, MedicoId = consulta.MedicoId
                });
                if (consultas != null && consultas.Count > 0 && 
                    consultas.Any(
                                a => 
                                    (consulta.HoraEntrada >= a.HoraEntrada && consulta.HoraEntrada <= a.HoraSaida) || 
                                    (consulta.HoraSaida >= a.HoraEntrada && consulta.HoraSaida <= a.HoraSaida)))
                    erros += "Já existe uma consuta agendada para o médico selecionado\n";
                if (erros.Length > 0)
                    return erros.Substring(0, erros.Length -3);
                if (consulta.Salvar())
                {
                    agenda.Aprovado = true;
                    agenda.Avaliado = true;
                    agenda.Salvar();
                    return "*Nova consulta salva com sucesso!";
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return "Falha ao salvar a consulta!";
        }

        [WebMethod]
        public static string Reprovar(int agendaId)
        {
            var agenda = RzCorportativo.Lib.Agenda.CreateInstance(agendaId);
            if (agenda == null)
                return "Código inválido";
            agenda.Avaliado = true;
            agenda.Aprovado = false;
            try
            {
                if(agenda.Salvar())
                    return "*Item atualizado com sucesso";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return "Falha ao atualizar o item";
        }

        protected void buscar_Click(object sender, EventArgs e)
        {
            RzCorportativo.Lib.Agenda agenda = new RzCorportativo.Lib.Agenda();
            if(CPF.Text.Length > 0 || Nome.Text.Length > 0){
                var pacientes = RzCorportativo.Lib.Usuario.Listar(new RzCorportativo.Lib.Usuario()
                {
                    Cpf = EFramework.Web.Configuration.MaskConfiguration.RemoveMask(this.CPF.Text, "cpfKeyDel"),
                    Nome = this.Nome.Text
                });
                var paciente = pacientes.FirstOrDefault();
                if (paciente != null)
                    agenda.PacienteId = paciente.UsuarioId;
            }
            if (this.NomeMedico.Text.Length > 0 || Nome.Text.Length > 0)
            {
                var medicos = RzCorportativo.Lib.Medico.Listar(new RzCorportativo.Lib.Medico()
                {
                    Pessoa = new RzCorportativo.Lib.Usuario()
                    {
                        Nome = this.NomeMedico.Text
                    }
                });
                var medico = medicos.FirstOrDefault();
                if (medico != null)
                    agenda.MedicoId = medico.MedicoId;
            }
            agenda.EspecialidadeId = EFramework.Web.TypeExtension.ShortExtension.Parse(this.Especialidade.SelectedValue, 0);
            if (!"0".Equals(this.Status.SelectedValue))
            {
                bool status = "1".Equals(this.Status.SelectedValue);
                agenda.Aprovado = status;
            }
            agenda.DataConsulta = EFramework.Web.TypeExtension.DateTimeExtension.Parse(this.Data.Text, DateTime.MinValue);
            if (this.CPF.Text.Length == 0 && this.Nome.Text.Length == 0 && this.NomeMedico.Text.Length == 0 && "0".Equals(this.Especialidade.SelectedValue) && this.Data.Text.Length == 0 && "0".Equals(this.Status.SelectedValue))
            {
                agenda.Avaliado = false;
            }
            var agendamentos = RzCorportativo.Lib.Agenda.Listar(agenda);
            if (agendamentos != null)
                agendamentos = agendamentos.OrderByDescending(o => o.DataConsulta).ToList();
            this.ListaAgendamento.DataSource = this.DataSource = agendamentos;
            this.ListaAgendamento.DataBind();
        }
        
        protected void ListaAgendamento_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            DataSource = DataSource == null ? RzCorportativo.Lib.Agenda.Listar(new RzCorportativo.Lib.Agenda() { Avaliado = false }) : DataSource;
            this.ListaAgendamento.SetPage(e.NewPageIndex, DataSource);
        }
    }
}